Stan obiektów w Rubim


dr inż. Aleksander Smywiński-Pohl

apohllo@agh.edu.pl

http://apohllo.pl/dydaktyka/programowanie-obiektowe

konsultacje: wtorek 15:30 - 18:00, pokój 4.61

In [ ]:
class Speed
  def initialize(value)
    @value = value
  end
  
  def to_s
    "Speed: " + @value.to_s
  end
end
In [ ]:
speed1 = Speed.new(10)
speed2 = Speed.new(20)

puts speed1
puts speed2
In [ ]:
class Speed
  def initialize(value, unit)
    @value = value
    @unit = unit
  end
  
  def to_s
    "Speed #{@value} #{@unit}"
  end
  
  def +(other)
    if @unit == other.@unit                   # <--------------!
      Speed.new(@value + other.@value, @unit) # <--------------!
    else
      self # lepiej rzucić wyjątek
    end
  end
end

In [ ]:
class Speed
  attr_reader :unit, :value
    
  def initialize(value, unit)
    @value = value
    @unit = unit
  end
    
  def to_s
    "Speed #{@value} #{@unit}"
  end
  
  def +(other)
    if @unit == other.unit
      Speed.new(@value + other.value, @unit)
    else
      self
    end
  end
end
In [ ]:
speed1 = Speed.new(10, :KMH)
speed2 = Speed.new(20, :KMH)

speed3 = speed1 + speed2

puts speed3

In [ ]:
class SpaceShip
  def initalize(speed)
    @speed = speed
  end
    
  def accelerate(speed)
    @speed += speed
  end
end

Atrybuty a dziedziczenie

In [ ]:
class Speed
  attr_reader :unit
  
  def initialize(unit)
    @unit = unit
  end
end
In [ ]:
class Speed1D < Speed
  attr_reader :value
  
  def initialize(unit, value)
    super(unit)
    @value = value
    @unit = :KMH
  end
end
In [ ]:
speed1 = Speed1D.new(10, :MS)
speed1.unit #=> :KMH

Zunifikowany dostęp do atrybutów

In [ ]:
class Speed
  attr_accessor :unit
  
  def initialize(unit)
    @unit = unit
  end
end
In [ ]:
speed1 = Speed.new(:KMH)
puts speed1.unit()
speed1.unit=(:MPH)
puts speed1.unit
speed1.unit = "abc"
puts speed1.unit
In [ ]:
class Speed
  attr_reader :unit
  VALID_UNITS = [:KMH, :MPH]

  def initialize(unit)
    @unit = unit
  end

  def unit=(new_value)
    if VALID_UNITS.include?(new_value)
      @unit = new_value
    end
  end
end
In [ ]:
speed1 = Speed.new(:KMH)
puts speed1.unit
speed1.unit = :MPH
puts speed1.unit
speed1.unit = "abc"
puts speed1.unit

Pytania?